/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.service;

import br.ufc.quixada.adrs.dao.AdrsDAO;
import br.ufc.quixada.adrs.model.Administrador;
import br.ufc.quixada.adrs.model.Adrs;
import br.ufc.quixada.adrs.model.Prazo;
import br.ufc.quixada.adrs.util.Msg;
import br.ufc.quixada.adrs.util.UtilAdrs;
import java.sql.SQLException;
import java.util.List;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Caio
 */
public class AdrsService {

    public static final Comparator<Adrs> comparadorPorNome = new Comparator<Adrs>() {

        public int compare(Adrs a1, Adrs a2) {
            return a1.getUsuario().getNome().compareTo(a2.getUsuario().getNome());
        }
    };
    public static final Comparator<Adrs> comparadorPorDataExclusao = new Comparator<Adrs>() {

        public int compare(Adrs b, Adrs a) {
            if (b.getDataExclusao() == null) {
                return 1;
            }
            if (a.getDataExclusao() == null) {
                return 0;
            }
            return a.getDataExclusao().compareTo(b.getDataExclusao());
        }
    };
    private final AdrsDAO dao = new AdrsDAO();

    public boolean insertAdrs(Adrs p) {
        try {
            UtilAdrs.upperCase(p);
            dao.insert(p);
            return true;
        } catch (SQLException e) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), e);
            return false;
        }
    }

    public boolean updateAdrs(Adrs p) {
        try {
            UtilAdrs.upperCase(p);
            dao.update(p);
            return true;
        } catch (SQLException e) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), e);
            return false;
        }
    }

    public boolean deleteAdrs(Adrs adrs) {
        try {
            dao.delete(adrs);
            return true;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return false;
        }
    }

    public boolean reativarContaAdrs(Adrs adrs) {
        try {
            dao.reativarAdrs(adrs);
            return true;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return false;
        }
    }

    public Adrs getAdrsByUsuarioId(Long id) {
        try {
            Adrs adrs = dao.getByUsuarioId(id);
            if (adrs != null) {
                UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
            }
            return adrs;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public Adrs getAdrsByUsuarioIdToAtivarConta(Long id) {
        try {
            Adrs adrs = dao.getByUsuarioIdToAtivarConta(id);
            if (adrs != null) {
                UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
            }
            return adrs;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public List<Adrs> getAllAdrs() {
        try {
            List<Adrs> listadrs = dao.getAll();
            if (listadrs == null) {
                return null;
            } else {
                if (listadrs != null || !listadrs.isEmpty()) {
                    Collections.sort(listadrs, comparadorPorNome);
                    for (Adrs adrs : listadrs) {
                        UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
                    }
                }
                return listadrs;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public List<Adrs> getPaginaAdrs(Long offset, Long limit) {
        Map hm = new HashMap(4);
        hm.put("offset", offset);
        hm.put("limit", limit);
        try {
            List<Adrs> listadrs = dao.getPaginacaoADRS(hm);
            if (listadrs == null) {
                return null;
            } else {
                if (listadrs != null || !listadrs.isEmpty()) {
                    for (Adrs adrs : listadrs) {
                        UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
                    }
                }
                return listadrs;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public List<Adrs> getPaginaAdrsByLetraInicial(String letra, Long offset, Long limit) {
        Map hm = new HashMap(3);
        hm.put("letra", letra + "%");
        hm.put("offset", offset);
        hm.put("limit", limit);
        try {
            List<Adrs> listadrs = dao.getPaginacaoByADRSLetraInicial(hm);
            if (listadrs == null) {
                return null;
            } else {
                if (listadrs != null || !listadrs.isEmpty()) {
                    for (Adrs adrs : listadrs) {
                        UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
                    }
                }
                return listadrs;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public List<Adrs> getByMunicipioId(Long id) {
        try {
            List<Adrs> listadrs = dao.getByMunicipioId(id);
            if (listadrs == null) {
                return null;
            } else {
                if (listadrs != null || !listadrs.isEmpty()) {
                    Collections.sort(listadrs, comparadorPorNome);
                    for (Adrs adrs : listadrs) {
                        UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
                    }
                }
                return listadrs;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public List<Adrs> getByEstadoId(Long id) {
        try {

            List<Adrs> listadrs = dao.getByEstadoId(id);
            if (listadrs == null) {
                return null;
            } else {
                if (listadrs != null || !listadrs.isEmpty()) {
                    Collections.sort(listadrs, comparadorPorNome);
                    for (Adrs adrs : listadrs) {
                        UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
                    }
                }
                return listadrs;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public List<Adrs> getAdrsByPrazo(Prazo prazo) {
        List<Adrs> listadrs = null;
        try {
            listadrs = dao.getByPrazoId(prazo.getId());
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
        }
        if (listadrs != null || !listadrs.isEmpty()) {
            Collections.sort(listadrs, comparadorPorNome);
            for (Adrs adrs : listadrs) {
                UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
            }
        }
        return listadrs;

    }

    public List<Adrs> getAdrsConfirmadosByPrazo(Prazo prazo) {
        List<Adrs> listadrs = null;
        try {
            listadrs = dao.getConfirmadosByPrazoId(prazo.getId());
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
        }
        if (listadrs != null || !listadrs.isEmpty()) {
            Collections.sort(listadrs, comparadorPorNome);
            for (Adrs adrs : listadrs) {
                UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
            }
        }
        return listadrs;
    }

    public List<Adrs> getAdrsNaoConfirmadosByPrazo(Prazo prazo) {
        List<Adrs> listadrs = null;
        try {
            listadrs = dao.getNaoConfirmadosByPrazoId(prazo.getId());
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
        }
        if (listadrs != null || !listadrs.isEmpty()) {
            Collections.sort(listadrs, comparadorPorNome);
            for (Adrs adrs : listadrs) {
                UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
            }
        }
        return listadrs;
    }

    public List<Adrs> getAdrsNaoIncluidosNoPrazo(Prazo prazo) {
        List<Adrs> listadrs = null;
        try {
            listadrs = dao.getNaoIncluidosByPrazoId(prazo.getId());
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
        }
        if (listadrs != null || !listadrs.isEmpty()) {
            Collections.sort(listadrs, comparadorPorNome);
            for (Adrs adrs : listadrs) {
                UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
            }
        }
        return listadrs;

    }

    public Long countNumeroAdrs() {
        Long countAdrs = null;
        try {
            countAdrs = dao.countNumeroAdrs();
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
        }
        return countAdrs;
    }

    public Adrs getAdrsById(Long id) {
        try {
            Adrs adrs = dao.getById(id);
            if (adrs != null) {
                UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
            }
            return adrs;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public List<Adrs> searchAdrsByNome(String nome) {
        try {
            nome = "%" + nome + "%";
            List<Adrs> listadrs = dao.searchByNome(nome);
            if (listadrs == null) {
                return null;
            } else {
                if (listadrs != null || !listadrs.isEmpty()) {
                    Collections.sort(listadrs, comparadorPorNome);
                    for (Adrs adrs : listadrs) {
                        UtilAdrs.marcarProdutoresNovos(adrs.getProdutores());
                    }
                }
                return listadrs;
            }
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }

    public String validaParaInsercao(Adrs adrs) {
        return new UsuarioService().validaParaInsercao(adrs.getUsuario());
    }

    public String validaParaEdicao(Adrs adrs) {
        return new UsuarioService().validaParaEdicao(adrs.getUsuario());
    }

    public List<Adrs> getAdrsesExcluidos(Administrador adminResponsavel) {
        try {
            List<Adrs> adrss = dao.getExcluidos(adminResponsavel.getId());
            //processamento de separação por adrs e ordenação por data de exclusao
            if (adrss != null) {
                Collections.sort(adrss, comparadorPorDataExclusao);
            }
            return adrss;
        } catch (SQLException ex) {
            LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
            return null;
        }
    }
}
